import { defineConfig, loadEnv } from 'vite';
import { fileURLToPath, URL } from 'node:url';
import vue from '@vitejs/plugin-vue';
import { visualizer } from 'rollup-plugin-visualizer';

// 当前环境执行的命令是dev
const mode = process.env.NODE_ENV as string;

// 获取当前的环境变量文件.env.development/.env.production
const viteEnv = loadEnv(mode, process.cwd());

const resolve = {
  alias: {
    '@': fileURLToPath(new URL('./src', import.meta.url)),
  },
  // 自动省略index和文件后缀
  extensions: ['.vue', '.js', '.json', '.mjs', '.jsx', '.d.ts', '.ts', '.tsx'],
};

export default defineConfig({
  resolve,
  optimizeDeps: {
    exclude: [], // 数组中依赖不进行依赖预构建
  },
  server: {
    proxy: {
      '/api': {
        target: viteEnv.VITE_PROXY_TARGET_URL,
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ''),
      },
    },
  },

  build: {
    // minify: 'terser',
    // terserOptions: {
    //   compress: {
    //     drop_debugger: true,
    //   },
    // },
    sourcemap: false,
    chunkSizeWarningLimit: 2000,
    rollupOptions: {
      // visualizer({ open: true ) 每次打包会生成打包分析文件
      plugins: [visualizer({ open: true })],
      output: {
        experimentalMinChunkSize: 20 * 1024,
        manualChunks(id: string) {
          // 对一些很大且很少用到的第三方库进行拆分
          // if (id.includes('html2canvas')) {
          //   return 'html2canvas';
          // }

          // 将node_modules中的文件单独打包 name 为 vendors
          if (id.includes('node_modules')) {
            return 'vendors';
          }

          // 对某些特定的文件进行拆分（比如首页拆分，这样也可以实现按需加载）
          if (id.includes('src/views/home')) {
            return 'home';
          }
          // return 'index';
        },
        chunkFileNames: 'static/js/[name]-[hash].js', // 分割后的文件名
        entryFileNames: 'static/js/[name]-[hash].js', // 入口文件
        assetFileNames: 'static/[ext]/[name]-[hash].[ext]', // 静态资源
      },
    },
  },

  css: {
    modules: {
      scopeBehaviour: 'local',
    },
    preprocessorOptions: {
      // key + config key代表预处理器名
      less: {
        math: 'always', // 设置全局px计算
      },
    },
    devSourcemap: true,
  },

  plugins: [vue()],
});
